package bitset;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

public class MyBitSet {

    public byte[] elem;// 字节数组， 将每个字节的对应比特位置为 1，则代表该位有数据
    public int userSize;// 有多少有效的数据

    public MyBitSet(int size) {
        this.elem = new byte[size / 8 + 1];
    }

    /**
     * 某位 置为 1
     */
    public void set(int val){
        if (val < 0){
            throw new IndexOutOfBoundsException("数据不能为负数！");
        }
        int arrayIndex = val / 8;// 看是第几个字节
        if (arrayIndex >= elem.length){
            // 扩容
            this.elem = Arrays.copyOf(this.elem, val / 8 + 1);
        }
        int bit = val % 8;
        byte temp = (byte)(1 << bit);

        elem[arrayIndex] |= temp;
    }
    /**
     * 某位 置为 0
     */
    public void reSet(int val){
        if (val < 0){
            throw new IndexOutOfBoundsException("数据不能为负数！");
        }
        int arrayIndex = val / 8;// 看是第几个字节
        if (arrayIndex >= elem.length){
            throw new IndexOutOfBoundsException("数据不存在!");
        }
        int bit = val % 8;

        elem[arrayIndex] &= ~(1 <<  bit);
        userSize--;
    }

    /**
     * 数据个数
     * @return
     */
    public int size(){
        return userSize;
    }


    /**
     * 判断某个数是否存在
     */
    public boolean get(int val){
        if (val < 0){
            System.out.println("不存在该数! ");
        }
        int arrayIndex = val / 8;// 看是第几个字节
        if (arrayIndex >= elem.length){
            return false;
        }
        int bit = val % 8;

        if ((elem[arrayIndex] & (1 << bit)) != 0){
            return true;
        }
        return false;
    }
}
